{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 异常检测---基于相似度的方法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "主要包括两个方面：\n",
    "- 基于距离的度量  \n",
    "- 基于密度的度量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. 基于距离的度量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通常基于距离来判断数据中的异常值。这种方法适用于多维数据，也适用于多个领域，例如分类数据、文本数据、时间序列数据。基于距离的异常检测有这样一个前提假设，即异常点的 $k$ 近邻距离要远大于正常点。解决问题的最简单方法是使用嵌套循环。 第一层循环遍历每个数据，第二层循环进行异常判断，需要计算当前点与其他点的距离，一旦已识别出多于 $k$ 个数据点与当前点的距离在 $D$ 之内，则将该点自动标记为非异常值。 这样计算的时间复杂度为$O(N^{2})$，当数据量比较大时，这样计算是及不划算的。 因此，需要修剪方法以加快距离计算。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 基于密度的度量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "离群点是在低密度区域中的对象。**每个对象的异常得分是该对象周围密度的逆**。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "基于密度的算法主要有局部离群因子(LocalOutlierFactor,LOF)，以及LOCI、CLOF等基于LOF的改进算法。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.1 k-距离(k-distance neighborhood)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于数据集$D$中的某一个对象$o$，与其距离最近的$k$个相邻点的最远距离表示为$k-distance(p)$，定义为给定点$p$和数据集$D$中对象$o$之间的距离$d(p,o)$，满足：\n",
    "- 在集合$D$中至少有$k$个点$o'$，其中$o'∈D{p}$，满足$d(p,o')≤d(p,o)$\n",
    "- 在集合$D$中最多有$k-1$个点$o'$，其中$o'∈D{p}$，满足$d(p,o;)<d(p,o)$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "白话：对点$p$到点$p$周围的点的距离从小到大排序，第k近的距离就是k距离。这里不包括点$p$自己到自己的距离。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.2 k-邻域(k-distance neighborhood)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由k-距离，我们扩展到一个点的集合——到对象o的距离小于等于k-距离的所有点的集合，我们称之为k-邻域：  $$N_{k − d i s t a n c e ( p )}( P ) = { q ∈ D \\backslash{ p } ∣ d ( p , q ) ≤ k − d i s t a n c e ( p )} $$  \n",
    "在二维平面上展示出来的话，对象o的k-邻域实际上就是以对象o为圆心、k-距离为半径围成的圆形区域。就是说，k-邻域已经从“距离”这个概念延伸到“空间”了。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "白话：k-邻域是到$p$的直线距离小于$p$的k距离的所有数据样本构成的集合。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.3 可达距离(reachability distance)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 若$p_i$在对象o的k-邻域内，则可达距离就是给定点p关于对象o的k-距离；  \n",
    "- 若$p_i$在对象o的k-邻域外，则可达距离就是给定点p关于对象o的实际距离。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "给定点p关于对象o的可达距离用数学公式可以表示为： \n",
    "$$ LRD_k(x^{(i)}) = distance_{reach}(p, o) = max(k_{distance}(o), d(p, o))$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.4 局部可达密度(local reachability density)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "密度可以理解为点的聚集程度。点到点的距离越短，则密度越大。局部可达距离：使用数据集$D$中给定点$p$与对象$o$的k-邻域内所有点的可达距离平均值的倒数。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "假设$x^{(i)}$的k距离邻域中有N个样本点，用$x_N$表示，$x_N^{(t)}$表示$x_N$中的第t个样本点，那么$x^{(i)}$的局部可达密度（local reachability density）可以写成：  \n",
    "$$ LRD_k(x^{(i)}) = (\\frac{1}{N} \\sum_{t=1}^N)RD_k(x_N^{(t)}, x^{(i)})^{-1} $$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.5 局部异常因子"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "局部异常因子（Local Outlier Factor）通过计算“局部可达密度”来反映一个样本的异常程度，一个样本点的局部可达密度越小，这个点越有可能是异常点，也就是说，一个样本的局部异常因子越大，这个点越有可能是异常点。  \n",
    "$$ LOF_k(x^{(i)}) = \\frac{\\frac{1}{N}\\sum_{t=1}^N LRD_k(x_N^{(t)})}{LRD_k(x^{(i)})}$$  \n",
    "上式的分子表示$x^{(i)}$的k距离邻域中的所有样本点的局部可达密度的均值，分母是$x^{(i)}$的局部可达密度。实际上是比较$x^{(i)}$的密度和其邻域的密度来判断$x^{(i)}$是否是异常点。$x^{(i)}$的密度越低，$LRD_k(x^{(i)})$的越小，$LOF_k(x^{(i)})$的值越大，$x^{(i)}$越可能是异常点。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果这个比值越接近1，说明这个点与领域密度差不多，可能和邻域同属一簇；如果这个比值小于1，说明该点的领域密度高于邻域点密度，该点为密集点。如果这个比值大于1，说明该点的密度小于其邻域点密度，该点可能是异常点。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 代码实现"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- #### 基于sklearn的实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import LocalOutlierFactor\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "pd.set_option('display.max_columns', None)\n",
    "pd.set_option('display.max_rows', None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构造集群和离群点的数据集。该数据集包含两个密度不同的正态分布集群和一些离群点。\n",
    "np.random.seed(61)\n",
    "\n",
    "# 构造两个数据点集群\n",
    "X_inliers1 = 0.2 * np.random.randn(100, 2) + 2  #100个数据\n",
    "X_inliers2 = 0.5 * np.random.randn(100, 2) - 2  #100个数据\n",
    "X_inliers = np.r_[X_inliers1, X_inliers2] \n",
    "\n",
    "# 构造一些离群的点\n",
    "X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2)) #low:采样下界， high:采样上界，size:输出样本size  #20个数据\n",
    "\n",
    "# 拼成训练数据\n",
    "X = np.r_[X_inliers, X_outliers]\n",
    "\n",
    "n_outliers = len(X_outliers)\n",
    "ground_truth = np.ones(len(X), dtype=int)\n",
    "ground_truth[-n_outliers:] = -1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title('构造数据集(LOF)')\n",
    "plt.scatter(X[:-n_outliers, 0], X[:-n_outliers, 1], color='b', s=5, label='集群点')\n",
    "plt.scatter(X[-n_outliers:, 0], X[-n_outliers:, 1], color='orange', s=5, label='离群点')\n",
    "\n",
    "plt.axis('tight')\n",
    "plt.xlim((-5, 5))\n",
    "plt.ylim((-5, 5))\n",
    "legend = plt.legend(loc = 'upper left')\n",
    "legend.legendHandles[0]._sizes = [10]\n",
    "legend.legendHandles[1]._sizes = [20]\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "      <th>pred</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.913701</td>\n",
       "      <td>2.087875</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000494</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.999748</td>\n",
       "      <td>2.212225</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.005255</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.040673</td>\n",
       "      <td>2.133115</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.001521</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.791277</td>\n",
       "      <td>1.743218</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.015652</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.991693</td>\n",
       "      <td>1.770405</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.010113</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y  pred     score\n",
       "0  1.913701  2.087875   0.0  0.000494\n",
       "1  1.999748  2.212225   0.0  0.005255\n",
       "2  2.040673  2.133115   0.0  0.001521\n",
       "3  1.791277  1.743218   0.0  0.015652\n",
       "4  1.991693  1.770405   0.0  0.010113"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 训练模型\n",
    "clf = LocalOutlierFactor(n_neighbors=20, contamination=0.1)\n",
    "\n",
    "# 对单个数据集进行无监督检测，以1和-1分别表示非离群点与离群点\n",
    "y_pred = clf.fit_predict(X)\n",
    "\n",
    "# 预测错误点\n",
    "n_errors = y_pred != ground_truth\n",
    "X_pred = np.c_[X, n_errors]\n",
    "\n",
    "X_scores = clf.negative_outlier_factor_\n",
    "\n",
    "# 实际离群值有正有负，转化为正数并保留差异值\n",
    "X_scores_nor = (X_scores.max() - X_scores) / (X_scores.max() - X_scores.min())  #正则化\n",
    "X_pred = np.c_[X_pred, X_scores_nor]\n",
    "X_pred = pd.DataFrame(X_pred, columns=['x', 'y', 'pred', 'score'])\n",
    "X_pred_same = X_pred[X_pred['pred'] == False]\n",
    "X_pred_different = X_pred[X_pred['pred'] == True]\n",
    "\n",
    "X_pred.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAEGCAYAAABFBX+4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABvTklEQVR4nO3dd3hUVfrA8e+Znkx670DonZCAgA17Qdfee1nr2lZd69p117rqT8Gu6+qKva0dBaQLobeEFNJ7nWT63PP7YwIECJBKEnI+z5MnzMyde88Mk3fOfe857xFSShRFUZT+Q9fbDVAURVE6RgVuRVGUfkYFbkVRlH5GBW5FUZR+RgVuRVGUfkYFbkXp44QQoi/uS+k9KnArHSKEMAgh/tKZACCE+D8hxJn7edzYxn3BQoijW/49RghxckeP22pfoq1jHOA5vwgh0lrdniqEyG7r9QshjmzH/u4XQhg6cPwLgFva3eAD+2d72qn0be3+ACmHJiFEFuAD3G08HAfcI6X8d8u2RimlRwhxLFAjhPgY/5f/X4BxrZ53FxAAfAY0A1rL/cnAiUKIG1puG4BA4AIpZRHwuhDiHGArEA58ALwAvNESvG8HtgE/trTnNyAWcOzj5ZkAj5QyveV2PPCNEMIF7DmBYSJgBVKklMWt7ncBtla3rwA8wBnAVzvubPlCeEAIYW9p37WAveX1vQ/MbjnmLcA/9tHe3QghUoDrgZOFEFcCJ0spL2xjuz8Dj+L/v3hcSvlqy/ZzgIZWmz4H/BP4XghxkpSysT3tUPogKaX6GcA/wEZg8D4eewS4uNXt34E1wKqWnwrgXuBL/IHqHCC71fZ6YAj+oDgHOB6YBPwGHAOEAQEt2+patl+A/wvjSuABYBhwYss+tgPTAUvLc34CJrU63unAja1uDwaWH+D1J+P/gvkYGNvq/jjgr8Am4AngNGA0kAtEA5nA8D32pQOOw/9FdiUQ0vL7XuBD4AiguAP/N+8Bk1v+fSUwt41tRgK1wAggteXfo/e1fctzzgMe7e3Pnvrp/I9KlShe/D2wtXv+AGcCTa22vRR/b3MacA3+nugz+HvVOfh7v1+02j4I+FJKuQ5YiL/n+SNQD2zB/8VwYsu2hwOLgcn4e7L34+9tXoo/aH7Zso9L8Qd8WtoihBDmltRFXMsPQggT/i8C775euBDiIuAH4BUp5QVSyk1tbBYHiJZjzgUekFJWATcDC4UQ17Wkj+KAE6WUv7Z67iYgtFVb99mWNtpmBgZJKVcfYNPTgJ+klNlSyjz87++sAzznC/xfoko/pVIlCvhTEKX7elAIEQg4gWKgCpiBv3f7DP7guMNpwN9b3fYBXiHETPw95Zn4e6yXAVfhD2Q+ACnlIiHEdcDn+L8U/tRy/z9a2pCKPw2Qs0fzYoD/4E9pxLccbxZgBp4+wOseBnwgpVyw5wNSynIhxEf40wvvA/9uef0PCSHubXndFwKv4f/CcQDPCCEGt9qNE2jEnzbqqFT8X27t2a6g1e1C/Gca1ft6gpTSJ4RoFEJYpJTOTrRN6WUqcCtB+HvQbeW4wd/rPR9/r/Nt/IH25ZbHTgAuxh/QBP7T9taBXIc/eD3Rcvt/QOUe+/+21b/vwB/k/txy+0chxFP40w/DgU9aLuylSSl9LdtUSCnHAQghPgN+lVLOabk9GLih5d+nAk/iPzvYIanlsdNa3WcFnpRSfgZcjj8vfSP+9Mc6/D3vVCnlCiHEEfjzzoUt+zkOSMSfEqHlvepsMaBwoK4d21nYPUi72fVFcYYQorzl329IKR9qtV1dyzHKOtk+pRepwK0EAs8DS/a4/ykp5SdCiDMAe0saYXxbOxBCfIA/QJ0DfC2EyJBSVkn/xa8jWrbR4e9BXr+PlARAFlAopXyk1X07LkT+D7i9jR73jjYcjj+3K4UQI/DnlXeSUn4PfL/Hc+5teeyfbewvAH+eeHHLfi/E34N/EHgROAx4CngJfy8XKWWVEOIq/F9Yrb8gOvN3VgNEtmM7O/7gvYO55T6Ar2UbFzNbROLPhyv9kMpxD2AtAa4C/6iPMCnlJCnlJPy53LCWzUy0BAIhxMVCiEohxKqWH7cQYmfQkFKuxR8cL2/ZfokQYoUQYjH+4GbAP3Jkcauf4pZtJwJ3A3e27DtXCPGMECKpJX9sBqKEEPFCCGurl2EUQtyO/yzgNCnleS3tXdzynM66Df+Xhg1/Lv5x/D1ULxAhhBgHDAK+afV+Tm957cvw/22V4L+IuQD/mUhHhiLm4f/CaM92g1vdHgTk7+8JLSNgrFJKVwfao/QhKnAPbCcBi/bx2I5TfBO7htu5gU+klBlSygz8aY8dKZZwIcS1wFHsOv3eMWzuYfzplHT86ZW1wGtSyiPYdfFT4s99r2vZ9z0t+74Sfz48CX+P/ir8Iyh28OJPFcyUUuYDSCkfwB9AuxKY3mDXsL0qKWUD/pEhF7e8nrOBj6SUnlbPuRN/Hn4hMAb/iJ2HgOX48+R57T14y363tKRj9ud/+IdYjmy5DnAi8N0BnnNxy/OUfkqlSgaolp7yrfjz1xagWgixqtUm/xRC6IEIdg+u5wshprXcjsGf29bh75lOAm7dY2QFLceR+HvFtfgvpp0hhPik5flIKde35GPHt/TQI4EvpJRPtLT3cOD1PVIlRvxnBw7grjbmxJjwXxxs6/Wb8Y8YKW7rcSllbct2ouWXEX/w9Uop61rGkN/QMnrFg3+UxsSW92ck/vd1HPAK8JiU8v6W/XWk1/0w8FlLfh7gHCFE61E+90spXxZC3I2/V6/DP+olq6X339brTsR/3eK4DrRD6WNU4B64MoBfpJRrWt3eSQhxGP5T/a+llDuChQa81SoIrcYfPE34A9rDexzDAiClPGPPg7cEkHX489o7GIENUsojhBDnAlP32NeeqQ8j/sk7a9t6gS0XJz9v4349/ok8HuDctp7birnlZ/6O19PqC+K/+L94Tsd/9nGflFITQswG/ialbBBC3Ao82pLj3wBsPsDxdpJSVgghHgEuklK+gX9cd1vbvQW8tcd97+1j+6vxX2fY16QlpR8QUqoVcJTeIYTQSSm1A2+5z+dHAI1SynaPj+6uYx9g38Y9Uig77g+UUtrbeo6idIQK3IqiKP2MujipKIrSz6jArSiK0s/0+MXJqKgoOXjw4J4+jKIoyiElMzOzWkoZ3dZjPR64Bw8ezKpVqw68oaIoirKTEKJgX4+pVImiKEo/owK3oihKP6MCt6IoSj/TKzMnPR4PxcXFOJ2qFPCBWCwWkpKSMBo7tFSioiiHsF4J3MXFxQQHBzN48ODW04eVPUgpqampobi4mCFDhvR2cxRF6SN6JVXidDqJjIxUQfsAhBBERkaqMxNFUXbTazluFbTbR71PiqLsacBfnKyvr2dHvZbKyj1X1QKfz7fb7erqagoLCwH49ttvUbVeFEU52AZ84L7mmmv4/fffcTgcXHjhhdhstt0eP+aYYxg+fDhHHnkk999/P01NTdx2221s27aNV155pc0e8SWXXMIff/xxsF5CnySlJMdu5+PKSu7JzeWarVu5fMsW/pyVxePbt/NDTQ2V7n0tc6koyv4M6HrcH374Ib/99hs1NTX4fD6qq6s5/fTTdz4+f/58Zs+ezdy5cznzzDP59ttv8fl83Hnnnbz11luceuqp1NfXExYWttt+jUYjt9xyC8HBwQC43W5+//33g/nSek2Jy8WbpaW8WVaGXggygoOZHBTEiMBADELg1DTyHA6eLyois6mJIRYLNyUkcFFsLFa9/sAHUBRl4AbuVatW8c9//pOxY8dy2mmnYbPZ+PzzzznttNPwer2ceeaZfPnllzzxxBPU1tbyww8/UFlZSWBgINnZ2SxdupRjjjmGwsLCvQI3wKuvvkpGRsbeBz5E1Xk83Jmby1fV1VwUE8NPEyYwLihov8/RpOSXujpeLSnhnrw87h80iNuTktCrvL6i7Fe/CdzffAM//wwnngh/+lPX9zdu3Djmzp3L6aefzuLFi3G5XNTU1LB48WI8Hg/JycmceeaZZGdnk5eXx/jx46mqquLaa6+loqKCpqYmHnzwQaKj/TVgioqKmDBhAhMnTgTgrrvuAmDr1q389NNPO+8/FH1bXc2N2dmcFR3N9mnTCDG072OlE4KTIiI4KSKCbXY7f87K4vOqKt4dNYqRgYE93GpF6b/6ReD+5hu46CKw2+Hdd+Gjj7oevC0WC2azmeTkZI4//nhsNhulpaUcf/zxgD+9AfD7779zzjnnkJiYyEknncRvv/3G+vXrycnJ4b333uOaa64hNjYWs9nM5PR0vvzxR7xSIvEv633LtdcespNnpJQ8UVDAO+XlfDhmDEe3cebRXsMDA/lt0iTmlJZyxJo1fDR6NMdHRHRfYxXlENIvAvfPP/uDNvh///xz9/S6AwICOOussxg3bhyLFi3i7LPPZty4cYA/T11aWsqKFSuw2+3odDpOOeUU7r77bo455hiKioq4//77sft8FDidZNfVsTIzk+OPPRaBfyFCCeRmZXHa9ddjsNuJMhoJMxjQHSKpgEe2b+fL6mqWT55MrMnU5f3phODmxEQmWK2cs2kT/1XBW1Ha1C8C94kn+nvadjsEBvpvd9XGjRu56aab0Ol0vPrqq9TX16PX63nnnXcYMmQIHo+HU089lUsuuYSzzz6buLg43nzzTe666y58Ph+Za9Zw/d13M+nwwznjlFOo2bCBdatX43A4GDNmDFu2bCE+Ph6DwcCGTZuINBqp9HgocrmIN5mINhr79Rjtd8rKmFtZyaK0NGK6IWi3dmRYGJ+PHcs5mzaxcNIkRlut3bp/RenvenzNyYyMDLlnPe4tW7YwevToDu2nu3PcAAUFBcydO5e1a9cyc+ZMhBBs3LgRh8PBRRddxLRp03j11Vf58MMPMZlMHHXUUTzz7LNsKi3lgb/9jXfee49IgwGXy0V6ejrLli3j2muv5e677yYnJ4fVq1fz4IMPctRRR7FgwQLCw8N39tB1QjDIYsGiO/CIzM68Xz2pwOkkIzOTBZMmMbYHg+rskhLeLy9nyeTJ6oJlP5dttzO3spJVNhsbm5ux+3xYdDpGW61kBAdzXnQ0Ew5wMXugEUJkSinbHOHQb8Zx/+lP8Mor3Re08/LyuOaaaxg6dCj//e9/MZlMuN1uXn75Ze68806+++47srOz8Xq9vPjii7z//vu4XC6yHQ7q7XasUhLV0mvesmULN998MyEhIdx88800NDRwwQUXEBQURGhoKHfffTcbN24EIFCvZ1RgIKEGA1vtdpq8HV6gvFdJKbk2K4u/JiX1aNAGuCEhgUC9nueLinr0OErP2dDUxInr1nHkmjXUe71cERfHTxMmsCYjg18nTeKGhAS8UnLq+vUcsXo1yxsaervJ/UKne9xCiFjgRyll2v62664ed2/zSck2u50AvZ4Us7lb0hwNXi/5TifDAgII2s8Y5r70fs2rreX2nBzWZmRgaMfZQlflORxkZGZSMG0awe0craL0PiklTxcW8nxxMY8PHsxV8fGY9/N58WoacysruSs3lyvj4ngyNXXAn2Xtr8fdlb+E54CALjy/Xyl0OjHpdN0WtAFCDQYGm83kOhyMCQzEeBACYVe9WlrKLUlJByVoA6QGBHBMWBgfVFRwY2LiQTnmQNXo9bKkoYFMm40ytxsBDLZYyAgOZnpo6H4Db2tSSm7eto1VNhur09NJtlgO+ByDTselcXGcGBHBxZs3c/HmzXw4evRB+5z1N516V4QQxwLNQHn3Nqdvqvd4aPL5GGSxdPsFxTCjkQiDgSKXq1v32xOKnE4W1tdzSUzMQT3uTYmJzC4tVXVhekiR08mN2dkMXr6c54qKsPl8jA4MZERgIIUuF/fm5TFo2TIezMujsR2pvWeLilhls/HrxIntCtqtxZhMfDdhArVeL/fm5XX2JR3yOtzjFkKYgL8DZwFf7WOb64DrAFJSUrrQvN6nSUmBy0WqxdJjp24JZjObm5tp8HoJ7cPpgJ/r6jglIoKgg9zGY8PCqHS7KXa5OhwIlP17r6yMu/Py+HN8PBunTCHBbG5zu63NzTxTVMT4lSt5Z9QojgsPb3O7Tc3N/sCdnt7p1JZZp+Oj0aOZsGoVZ0ZFcUQX5gccqjrT474XmC2lrN/XBlLKN6SUGVLKjB0zC/urKqeTQJ1u54ewJ6oD6oUgwWymoo8XXcq02ZjSUn/lYBJCkB4cTOYeBcCUrnl8+3b+UVjIrxMn8lRq6j6DNsAoq5V3Ro3izZEjuWTzZj5to5ImwN9yc3l40CAGdfELNspk4sVhw7gjN7dL+zlUdSZwHw/cLIRYAEwSQrzVvU06ODRNQ9O0nbeffvppPv/88523PR4PPp+PWccfz8kTJ/Z4dcBwgwG7puHco4xsX5Jps5HeC4Eb8AfupqZeOfah6MOKCt6vqOD3tLQODcM7MSKCnydO9OewGxt3eyzX4eAPm41r4uO7pY3nREdT4/Gwco/jKJ1IlUgpj9rxbyHEAinltd3bpINjw4YN3HnnnRgMBiorK4mOjua3337jzjvvZNiwYUgpeeixx7jvX/9i9ddfc9ZZZ/VodUCdEEQaDNR6vST00Sp521tGwHSK1MBZBZYY6ETKaXhAAD/X1nbu2Mpuylwu7sjJ4YcJEzo143VCUBAvDhvGFVu3sjojY+dFy08rK7kwJoaAbvr86oXgyrg45lZWMiUkpFv2eajoUrJSSjmzm9px0E2cOJFrrrkGIQQmk4mHH34Yl8vFqaeeyt13380rr7zC9pISnnnqKZrr6/nxxx97vDqgVa+n1uPpplfY/Vya1q4JQ3uRGsw7BqqXQtQMOH4+iI7tx6LT4VIXJ7vF80VFXBwT06Wzp4tiYni3vJy5lZVcERcHwCqbjbO7OTU6IySExwsKunWfh4K+eyVsT84qaN4O1sFg6Z4Ph8/nY/v27WzYsIH777+foUOH8uabb/LDDz/Q3NzM9OOO44zsbKoLCw9KdcBAvZ7iPjy6xCAE3s4ET2eVP2hLr/+3swoCYju0C4+UGAf4uN7u4PT5+HdFBSsmT+7SfoQQ3JaYyBMFBTsD92a7nYfbOymrnWdg44OC2NTc3KW2Hor6R+De/hGsuAZ0JtDccNjbMPiiLu922rRpeL1ekpKS+Pe//83RRx/N4YcfDsCll16KS0pWLlnCheee267qgOnp6cybNw+k9AcpYeDKq67C1M7TUbMQuKVEStkn65hEGo1UuN1Ed/T02hLj72nv6HFbOj6csMLtJvIQrbJ4MK1paiLFbCa1symvVk6OiODCzZtp9HoJMRhwaNp+J5Lt1IEzsCC9Hnura1GKX98P3M4qf9D2Ofw/4L8dd3yXe97XXXcdmqYhpWTNmjU4HI6dAdPr9fLXf/yDzD/+wONw7LM64A5ut5vMzExmzpwJPjtoPtDp2bqtkDvuuKNd7RFC7Kwq2PfCNqQFBbG6qemACyTsRQj/H2cXctyrbTaO3ccQNKX9Mm02MtqTImlHj9ig0zEhKIg1TU0cHRaGRaejuT0X1ztwBtbs8xGgJuHspe+/I83b/T3t1nRG//1dFBgYyK+//srw4cP57rvvWLhwITNmzOD7779n3Lhx5GVnc+5FF/HII48we/ZsysvLueuuu3jyySdZs2YN999/Pz/99BMAf/zxB2vWrGH2Ky+x4Ks5zHnuXr769zPkZG/ZWdv7QGRLHe++GLTBP7JjVWeH5Amd/4+zk2cSmU1NvTai5VBS5fEQf6Azph094q+SYN5M/+19SDCZdq4dOiYwkI3tSWvsOAMThgOegW1obu7xmjj9Ud/vcVsH+9MjrWke//3dYOHChfz0009YLBa++eYbbDYbH330EQBHz5xJQ2Ult99++87qgM899xzV1dXU1dXx1FNPAeB0Ovn73//OsmXL+Nvf/sbdN55HzrZs3vnoRx58bBLXXnvtzuqA++NuyeP2xTQJwJGhoVyxdetBT+XkOxxUut2MUavidJleCDwHuk7RgR6xV8qdE9MygoNZ2tjIhbEHuH7RgTOwZQ0N6gu7DX2+x+00RvDHpPf5NPAE5gbN4qeAw6nIeLdbLlA6nU5mzpxJYWEhr7zyCs8++yyvvfYa1dXVLF26lIToaBwez87qgDt6zk6nE0+r0R97VQf0hnHB1XcRFJFMaFjYbtUB96fZ58Pah08LDwsJwaTTMb++/qAe9/XSUq6Mi+sXtVz6ulSLhawdq5LsSwd6xFkOB0Nb8uXnRUczt7KyfXMR2nEGpknJe+XlXHiQSyz0B32yHrdH0/iqupo5paUsb2xkREAAQ806DD471dLCGruLUIOBK+Pi+HN8/H5nfHXGjh6lU9PIstuZYLUelB5mkdO5cxZla32pOuCckhLm1dXxectKQT3N6fORsnw5S9LSGK563F22tbmZk9avZ/u0afv/TLcjx13n8ZC0bBn1Rxyx80v15HXrOCMqqlsKgn1RVcWTBQWsSk/vs2ehPamnqgP2iBWNjVy5dStRRiN/SUzku/Hj9xrQL6VkfXMzr5WWMn7lSu5OTuau5ORuqyS240Ni0ekwCkGjz9fjNUQ0KanxehnVDVf7e9KlsbE8WVDAwvr6Lq0x2V5PFhZyZGioCtrdZGRgICEGA7/V1++z3giwq0e8H+9XVHBGVNRuZ0LPDB3KcevWcVpkZJfqytR6PNyybRv/HTNmQAbtA+lT557PFxVxxoYNPDZ4MIvS0rhgH7OwhBBMDApizogRZKanM6+ujplr1/bI5JUYo3HnxZeeVOf1EqDTYemjsyZ3CDYYeG3ECK7eurV9Iwi6INNm443SUl4ZPrxHjzOQCCH4S2IiTxYUdKnOTrPPx4vFxdy8R896QlAQtyclcf7mzZ1eJMStaVyyZQvnRUcflM5Bf9RnAvczhYW8VVbGqvR0zutATmtwQAC/TJzItJAQjl+3joZuXlEm3GjErmnYenClGk1Kylyubllw92A4LSqKI0JDuTk7u8dKrdZ5PFy2ZQsvDBtGfDenwga6a+LiaPR6eaOsrNP7uDcvjyNCQzk8NHSvx+5PSWGc1cqJ69dT2sEJZTUeD3/asIEAnY7nhg7tdPsOdX0icM+vq+Pl4mLmTZxIUidOr4QQPDt0KBnBwdycnd2tbdMLwSCzme1OJ74eClIlLhcBej1hfbik655eGT6cLXY7d+bmdnvwbvB6mbVhAydFRHCxujDV7Qw6He+PHs3f8/P5vqamw89/saiIH2pqeGnYsDYfF0Lw+ogRnBwRwaRVq3i7rAz3ASbR+KTk48pKxq9cyRirlU/GjFGLKOxHr78zzT4f12Rl8frIkSR2oWclhODFYcNYYbPxdXV1N7bQv9iBVa+n0OnsdJDaMdFnB5/Ph9Pp5B/PP0+t10tKP+tVBhsM/DBhAksaGrgmK6vb0ib5DgfHrl3L5KAgnh86VOU3e8gYq5Vvxo3jqq1bebKgAG87Zic2er1cn5XFq6Wl/DppEhH7mcmqE4KHBg/mpwkT+E95OYOWL+fe3Fy+qa5mu8NBtdtNkdPJ9zU1PJSfT+ry5bxQVMTHY8bwwrBhKmgfQK+/O/8pL2e81cqsyMgu7ytQr+fFYcN4dPv2AwZYh8PBqaeeCsADDzzAzJkzd/4cffTRO7c75ZRTWLBgAb7SUprcbo6fNYu6ujqklPg6EKx++uknjjvuOCZNmsTxxx/Pk08+yaqNG5m/ZAlDLZZ+OdQtwmhk3sSJuDWNiStXsqgLwwQ1KZldUsKUzEwujo3l/4YPR6eCdo+aFhrKyvR0FtbXM3HVKl4rKWnzOlGR08lTBQWM+eMPfFKyKj293fW204KDWZCWxryJEzHqdMwpLeXItWsZ+ccfTFu9mheKinBpGl+MG8eK9HSOVDntdunVc3MpJbNLS/nXPk65OuOUiAhu3baNFY2NTGsj/wbQ1NREc3MzQggqKyt54IEHsFgs6HQ6NE2jqaXu82uvvUZjYyMXX3wxxxxzDBMmTqSkqIgRo0Yxcfx4brvtNk4//fT2teuUU5g8eTKzZs3il19+odLj4fkXX+SY6dMP+ooy3SnYYOCDMWP4urqaCzdv9ue+ExM5MjS0Xb1ll6bxeVUVLxUXI4BFaWmMVjPlDpoUi4WfJkzgt/p6ZpeUcHdeHtFGIylmMxqwzeHArWmcHR3Nt+PHk9bJyTBjrVYeHzKkexs/gPVqxCh2uahwuzm2G79ldUJwYUwM39fW7jNwf/nll7zxxhvk5+dz/fXX88knn6Br6fHqdDpCQkLIyspiwYIF/Pbbb8yePZvU1FS++eYbVi1fzktvv03GiSeSMXRoh2YRvvDCC1x/88089dprTJs5kxXff4/X4+Gt114jODiYX375hf66YtAZUVHMDAvj3+XlXJeVhVGn45SICNKDg0kPCiLOZMKo0+HUNHIdDjJtNlbZbHxVXc2EoCDuTUnhT1FRA35l794ghOC48HCOCw/HJyXb7PadiwUPCQjo1gWyle7Rq4F7x4oq3f2hyAgO5q39XDG/7LLLcLlcfPnllzzyyCMcddRRWK1W8vPzGTRoEJqmcfXVVzN37lwAkpOTefPNNzEajXzy8cfcc9NNuISg0Omk0G4n2mgkymzGrNPt9Vp8Ph8+KVmzdSuvvPoqU2fOZNTw4cz59Ve2btnC6tWrmTNnDhdeeGG/Ddo7hBoM3JqUxC2JiSxqaOD3+nrmVlbyt9xcajwe3FJi1ukYZDb7A3pwMH9NTmakGqPdZ+iFYJTVyih11tOn9WrgznE4GNUDf7SjAwPZ5nDsd5uvvvqKrKws7rvvPpYsWYJOp+PMM8/kgw8+wNKSv1uwYAEvv/wyBoOBjz/+GIPBwN13380jjzzCqaeeyllnncXi5ct57umnMZpMbRaI8rjd3Pn001x+zTVsKijgnptv5tnHHyc7O5uXX36ZX3/9le3btzN48OBufx96ixCCo8LCOErlKxWlR/Rq4PZIiakHTsFMOt1+C+ksW7aMkJAQxo0bx8yZM3nllVcwtOSZly9fzrvvvsull17K7Nmzufbaa/nXv/7FOeec42+zx8PLL7/M+vXr8fl8PP7wwzz+8MP+xzQNu6btXGxABwTodJh1OlavXs1tt91GTk4Os2bN4oQTTuCRRx7h0Ucfpba2lqCOlkpVFGXA6tWhDMF6PQ09MPuu3usleD8zEOfPn88//vEPAG6//Xa+/PJLzj33XMC/uEJpaSkBAQF8++231NfX89VXXzF16lTeeOMNHn74YZYtW8ZDDz20c1TKDkadjlCDgUijkUijkXCjEYtejxCCtLQ0Fi1axMyZM/nuu++47777GDx4MDk5OYwfP77b3wNF6YoNTU3cmJ1N6vLlxC9dSsaqVbxSXNztE9yUzunVHveEoCA+rKzs9v2ubWpiwn5ydPfffz8ejwcpJRs3bmTUqFHExMTgdrsRQvDoo49S0zIxYcdFySOOOIJt27bxzjvv8OCDD3a4TXl5eSxatIgtW7Zw6aWXMnXqVEaOHInBYGDZsmUsXLhwt2GIitJZUkp+b2jgvxUVVHo8hBsMnB8dzYkREQccYiml5O/5+bxdXs4NCQl8P348IQYDW+x2Xi8t5anCQr4dP16VWu1lvRq404KC2NjcTJPX261D4pY0NBxwVWiPx4PL5WLcuHHMmTOHq666isDAQKxWK0cd5V/IfsaMGQTukYNfs2YNZWVlaJrGggUL2t2m+vp6amtrefvtt0lLS+O7777jm2++4fvvv6eyspI777yToUOHkpSU1OHXqyg7FDudnL1pEzafj2vj4znRYqHU5eL+/HzuyM3lq3Hj9nsx+PmiIr6rrWV9RsZuS9QlmM0cFx7OF1VVzFq/nuWTJzO4jxdEO5T1elnXszdu5MTwcG7ohjKQ4J8uPXj5cjZPmXLI1LjoS2Vdlb6rzuPhsNWruToujntSUnYb4SSl5J3ych7Oz2f55MltlpZo9vlIWbaMlenp+12T8t7cXByaxkuq+FeP2l9Z116frndzYiL/Ki7G1U0Lgs4uKeHE8PBDJmgrSnu9WlLC9JAQ7h00aK9hqUIIromP5+LYWJ4uKmrz+R9XVpIRHMwnlZVcsWULt27bxrL6eqS93L8AdoubEhP5oKICRw9Xh1T2rdcD97FhYYyxWnls+/Yu72tLczPPFxXxz9TUrjdMUfoRTUreKCvjjj1TbVIDR8XOwHtLYiIfVlRgbyPoflxZyaKGBnKdTo4JCyPeZOTyNb9y1u9v45x3/M61J1MsFiKMRoo6WPlP6T69HriFEMwZPpx3ysv5qqqq0/up8Xg4b9MmnhgyhCEq96YMMLUeD00+H5NaXzRsY9HfZIuFWJOJfKdzt+cva2hgSUMDNyck8ObIkVwZH899MQFsLr8Eo/RwuzvNvyJOC03K3g8eA1ifeO/jzGb+N34812dn8+/y8g5X4Mt3OJi5di2nRUZyfUJCD7WybVJKvPsZIqVpGlo3pYEUZV90QqBJufvfTluL/tJ20H2huJjzYmJYv2OVdqmBlBgjp/J6w8t8HHgc1Xr/ijk5djs2n69LK9woXdNnqhulBwczb+JELty8ma+rq3lx2DBSDvDBcGsab5SW8sj27Tw4aBC3JSW1e/q8w+HgnHPO4fvvv+eBBx5gyZIlOx+TUrJw4ULAXxzqnnvuISUlhZSUlJ2zK0NDQ9E0jbKyMs477zzMLTl1r9fL+vXrmTx5MuCf8n7vvfcyZcoUhg4dysiRI9tsz9atW6mqqiJAnS0onRBuMBBtMrG8sZHpO2r07Fj0t3rpzkV/t9nt1Hm9e118/KW2lg0ZGaSvXs3mJhspy85maaMNY+hIDj9tLofnVfN7QwNnR0fzckkJV8XFYe6HFS0PFX0mcAOMDwpidUYGTxQUMGnVKo4OC+O8sChmFAUSkQN4wB0n2DDKzU+ynvfKy5kQFMTitLQO1VbobHXASZMmUVRUxKhRoxg/fjy33norp59+OsuWLdu57+eee45Zs2Zx33337XbM+vp60tPT9zmEcNq0aSpoK50mhODGhASeKSrii5AQfwdGCDh+/m6L/j5fVMQF0dH8t6ICq17P6ZGRO5cHdErJcWFhTFm9GvR3kB60DbdmYvu6XJLM/s/mO2VlfFVdzYqWjonSO/pU4AYw63Q8PmQI9yQn83FpJcO+gS2ykVfiKqkxePlTVRgXb4gg5SgjCyZN6lQxnK5UB1y2bBnvvfcep59+OsnJybvtt6CggEcffZT58+dTUFDAoEGD9jr2yy+/zNy5c3ceT0rJ5Zdf3ol3SlF2d31CAv+tqOCOnByeSk1lm8OBUQhGB8bgk5KnCwv5tqaGZp+Pdc3NrG9qwqFp/D0lhcnBwWRkZjIpKAiJwCUs1OhCeU38StbgP/Hnbdt4ND+fJk3jmNBQjlyzBo+UHBUayp3Jybvn1pUe1+cC9w5BBgMXbw/HF+3Deq6VU0TSzhKqnhwPl3xvJOSwzhWo6kp1wLlz53LdddftrG2yQ2NjI5dccglTpkxB0zQuu+wy7rzzTs4444zdtrv11lu59dZb92rTu+++26nXoig7WPV6fpk4kVPXrydk0SJCDAYE/op/OvwrvGtScn18PM8UF2NE4EXy94ICog0GdELQ5PPxesIYpsRZOHyNgat0o6jOyyNUr0eHf5m9L2tqOCYsDLvPx2fV1XxdU8P/DR/OFXFxvfwODBx9NnADuNe7sZ5j3Zm33vHbOMyICBR4C7wYh+x7+aT96a7qgCeddBJVVVWcc845PPDAA3z33XfodDq++OILjj32WIxG4141TSZMmEBMy1qKPp+P+fPnd/YtUpTd1Hu95DidvDFiBHlOJ99U1LDV1YwHmKjToQeeLy4GCZ4mPZSbYKidKq+Xl4YO47acHK74pIYRjlC8k4PIDXcQXhXCJ2encNKGdcwICWHhpEk7zxgLnE6OWrOGm7OzOS4srFNrxiod16evLmjNGvrwtotF6cJ1yObOzfpsXR3wxBNP5JVXXmH27NmAvzrgFVdcwS+//MLzzz/PFVdcQWVlJeeccw5nnHEGmzZt4uWXXyYhIQGfz8fWrVt3Vvo75ZRTdh4jKiqKr776ir/85S/U1tbudvyoqCjmzZvHvHnzVF5b6VZvlZVxRWwsV8Yl8MG7Ojb8YSDthWmcHBSFXdMo9XjwAWhAfiAkuvy1iCUku6xQFIAMd5F1WjaNKY1g9lH/8iDeLChHAp+MHYtOp8PrhY0bIdlk4bURIwjQ63m3vLxXX/tA0qcDtz5aj6dw7zXwpCbxFnnRRXeu+d1ZHXD48OF8/fXXHHvssXsdJzU1lbVr1xIREbHb/W63e+f6lnumXBSlK4pcLsZZrVRVQcGYcnhpOCv/Z+GnV4NYv06ys6ujA4Y0QcCuiTi3lWSRlB8FGXXEbIxBNJjg2ZHw6Ga+baxAD0zOzGTosuVYb8pn/AkOwiMkx4VE0OD1kmW398IrHpj6dNSwTLXg+M2BIdGAzrrrYp7zdyf6CD2G2M41vzurA+r1+t0uQu65mntIG8WuFi9evNd9HVl4WBkYMm023i4rY7vTiUkIjggN5ar4eCL3s7p6RnAwP9TWcsWYeEyBEp/U4RManFpKo9UDO6Yc6IGgVvMLfFDkdaJPLwOjpCq9HFlrhKvzkOFunIAExgYEsLTBhvuiAjinkMbiQN5YPwRNSuJbFaVSelafDtzGsUZ81T4a5zRiHGNEF6jDk+0BAUEXdm3hgZ6qDuhyudqckLNjiGFbZs2atTNnqCgVbjcXbt5MvsPB9QkJnBoRgUtKvq2uZtiKFdyVnMz9exSR2uGKuDheKi7m/vw8rh4Zwca5WSytt6GZWoL0jv7BjuWadvxuyUj6XBpI/93Y9SAFaGA16pDAssZGXggez23/tOO+PgfLb3HcM3wzQgiuPciT3wayTlUHFEKEAnPx/3c3AxdIKd1tbXug6oDt4av34dniQbokhmQDhlTDIbV4qaZp+w3cqjrgwFHv8XD4mjWcHR3NI4MH77V4cqnLxawNGzg9MpLHWlZNd2kalW43YQYDNp+POo+H54uL+aa6mkavFw+AC383TQdU6yHEBzoBhpa/fy9td+PqDBDm5aTgCJY66rE5JWwMgXgXxDnRC/93QbTBQOURR/TU2zIg7a86YGd73JcAL0gpfxFCzAFOBr7pbAMPRB+mRz993yva9Heqt63s8HRREYeFhPB4S1DeU4LZzE8TJjBu5UrOj47mg4oK3iorQycENR4PBiEwCsHUkBDOj4nh7bIy0CSYgAYDhHoh0kegTofdo8EHSXBRsT8StLVoarj/7PGn5pYL7PmBkNYAPv+GmkdwVlwEX9bU8FNtLSftcT1H6RmdihhSytlSyl9abkYDHV7GpqfrgB8q1Ps0cLg0jXfKyrgvJWX3B/ao8BdjMnFVXBxnbtzIVrudt0aMoNnnY1hAAEkmMwZ0LG9o4I3SUtw+6R9BAv6gDSDA7vOnRFgSDd5W0TqrJQW54/zZIRB2/a54PsgBb6fszJXLOiNWr4lgnY578/LU5/Ug6VJXTwgxHQiXUi7vyPMsFgs1NTXqP/kApJTU1NTsHFeuHNpW2WykWCwMb31dpY0KfwCTRCBnbgvh9cxkTHNdPFmcyLMBIzB+MMS/LmR5AJpXgFu364JkazqgKBCeWw+OVmEgtRmcwt9DB3DrkVIif4j1B3qLhGsL0aOD6yfDPRP5IrsBAZS5XHtVHVR6RqcvTgohIoD/A85p47HrgOsAUvbsPQBJSUkUFxdT1YUyrgOFxWJRy5kNEE0+H2F7Dg9to8KftzqSIz4zUR9u5rWh1RS4nExbFMfo9YLEnyPIOl2HI9QJRRZ/D3lHd7n1BUmAV4fBHdsgtlWw1bds5BAQIKHKBD4d5FjBJcAiOSEsjJuCBnNukIbvpBLsHsklIbH8z1aJU1XCPCg6FbiFECbgU+A+KWXBno9LKd8A3gD/xck9HzcajQzZRw5PUQaqWKORfIdjZ2kHYK8Kf1JE0/RpI++k1/FGQCU1Hg93pgzmBmMFU94dyQcXN3FkoZWKYTYY7IBtVkhu9vegdfiD9o7fz6wHmwGa9f6ArpP+HnqEB6rNEODyB34NuCkP8AeMycHBPFGXAzcK+D2S4P8M44p1Nv67oYyh6uzwoOhsquQaYDLwgBBigRDigm5sk6IMSBODgjDrdCysr991544Kf2cWw/ELcG10Y0gxsCiyCQ3wSsn5IXGYxzfxx+nb+RYHl+mtGHQCo4CY0R6mRYSCR0Clcfcetx4I80KQDxoNYNIg0uPfNt7l3y4rCIySYIOew8KCmRgURLbDwSeJaXBjOnwwmGan5G/b8v27PIRGe/VlnepxSynnAHO6uS2KMqAJIbg1KYn78vOZHxKCpaXcKkIHAbEAeAu9FCZ5WdPUxMiAAOoqBWl3VzC1cRJ5R27nhxGl3FgSzUs2A55/DSdilGTzRdlglBDj2XvkiIZ/SGCyP10SoBM4vC3bGIExTehmDyclwoz9z/nEmIwE6/VMyV1GxAsRVDdoiIw6xoVEYceDQY2QOij69AQcRRlo/hwfz6L6ek5ev545I0YwulXZYq+mUeBy8UpROf85djQjXKGM+GkL8ro8VtQWExzjI6AqiCCDHk+JGW7LJis7GINPw2gQeFz40yF6dvW6d8TZagNEeXF4JdRaAAFCQp0J7YtE7FcV8veCWCqcLo4cFs6jEwfxW2oDjibBKUlDuXTrFm7do8yx0nNU4FaUPkQnBP8ePZqnCws5Zu1aRlutTLBacWoa39fWcrk1kvvqEkiJDEdKOPKn8Sz+bwNhfykkOLGJP1WFUpnsw6B3Iu8dz2HRQSyfsoiXY0fxl6wcsHj9gVsAGuirzPhiXOBtieA6IMzt3yZAwxjl5pl7ypgVGkCA2YQrDLIybSQsgrBjoSDSwdHr8jk1IoIbe2DmZJnLxby6Omo8HiQQYTQyMyyMQQM8l96pmZMd0dbMSUVRDsytaXxXU+OvVaLTcXhICBMDgmic04jlSAvmSWY0DaqqICYGPFvd1HzXxGGTtxAfauFCawIPZZbQ1AxBVjA1WKgdVU3g9mD+PngwrxizKWnwtgzz0/wpkx0XLwGDEDyeE89wu4UfZtqZPXYEJp0Om9fLvLXVZPxm5IMTGjlpWBSTu3EhBSklC+vrmV1ayi91dZwYHk6cyYQAKj0efqqt5YjQUG5KTOSE8HB0h2hefX8zJ1XgPsRpUiLgkCoRMND5qn00fdSELkyHaYwJdODJ8uAt9xJ0QRBX1GWTZbeTpAvg23ui0H6NJvTMcm44t5FTKkKIrw6koFrHzxF2Xjsih6YKEwz2V/Yz2I2Ymo0430nhZC2KD060MS0ji4QwMzEmEy9HjSXGvwoajoUOpF0SeErnFjRpS5PXy0VbtpDrcHBzYiKXxcYSsscQyWafj48qKni1tJRQvZ4vxo0jYj+Ft/qr/QVudSXhEKNJyc+1tZy5YQPhixdjXLgQ48KFxC1Zwk3Z2WzYT7ErpX/QR+kJuTEEc5oZb4kXb6EX4ygjoTeHYog3cHZ0NGadji8mjeEIdyypkZJlI62kNwfywah6Tn49mKd/C2BKiZUlOSM4bUQANyQkcEl4PDFhOlxXp6P9HEdglYYj3EhkqIkHUgbxdbaNxGMbmTkTNA1M4024s9ssUdQpTV4vx69bR4zRyLqMDG5OTNwraIN/pZ9rExLITE8nPTiYo9asodazd/nnQ5nKcR9CPqms5IH8fKw6HTcnJvLmyJFEGI34pKTE5eL9igpOXr+eoQEBvDRsGGlqncB+SxgEpnEmTOP2LqX6p8hInioo4Oacbfz3hxTM77nYOMzF1QEFDDabiU+TLFxgpGmUl/PCG5mTn8SqkV5u3raNaxLjWZihZ+lSCAqQfPebZGWinbjoIDxfx6EdU8HS10OoqoLoQLGr2mAXSSm5eMsWxlitvDVyZLvOEHVC8PywYYicHM7cuJHfJk4cMKNaBsarHAD+WVDA33JzeWfkSNZkZPDnhASiTSb0QmDS6RgSEMDDgwezfdo0royL48T16/l5j5V5lEODUafjl4kTAbjy101sc9j5R0wZ8yZM4IjQMLb8fTnpi9eQdU8muqPMBFUJTiUMu6axrqmJn37VWLMGllbCkaNd6H+OIcpoYlioGRHiZcaMlpx6jgdDYvf0/RY3NJBlt/P6iBEdTus9M3QoLk3juwH0eVY97kPAnJIS3ikvZ9nkycSbzfvd1qjTcXV8PCMCAjhr0ya+Hz+eKW0s9qD0bxFGI3NGjMBeZIcMwU+T4tE0+NufQmncloLjBAfZbwQRbTbSPKIZbbuPmxISeK+8nJQVyxhisZD3ioMNS4fzYmMSMTGSmTc1crY3kKeeBNmk4VzsJPC07slvzy4t5ebERIyd6DHrhOCWxERml5RwRlRUt7Snr1M97n6uyOnkwfx8fpgw4YBBu7UjwsJ4bcQILt2yBU0V+zp0aaAz+HuwVVWwdCn4yixs/m84Wr3/gp4w+lMetyYlYdc0PhozhheHDaPs2MM46upoLprioerDBho2O7nNEo1ziYPGtxoxTzZ3erHu1spdLn6sreXy2NhO7+Pc6GjWNDWxbYAsn6YCdz/3RlkZl8TGMrQTiw6fHRWFRafjt7q6HmiZ0hcY4g148v0X7mJiYMYMMBjYme6QUuLJ9aCP1xNrMvHisGFctmUL65ubETowJvn47NRmHg8o4ZH6RAJ/96LVawRdGITl8O4ZSz2/vp5jwsII29/IkD1K2+7JotdzRlQUPw+Qz7JKlfRjbk3jrbIyfmvJZ3aUEIKbEhOZXVrK8aoA/iHJOMqI/Rc7ngIPxkFG5s/fNe5bCHBv9IAODCn+UHBFXBxDLRZeKC7mrtxcAI4LC+OvxyczKiysR9pY6/USu7/1KneUtm0ptMXx8/1lAPYQYzQOmNElKnD3Y7/W1THUYtltWvRepOYvDWpp+UvdwyUxMdyVm0uj19vm0CulfxMGgfUMK82fNWM52oJ5gpnYWIHm0HCtduNc7iTo4qDdLggeERbGET0UpPfZzv092EZp2x21W9q9j0OM+kvtx8rc7t2L7u+pHT2VIIOBaKORKo9HBe5DlDHVSNDFQTgXOXH86kBYBNIpMY00EXxFMPqo3l0WMMJgoNK9n/Hge5S2xRLT5mZVHg/j99eJOYSov9R+zKlpWPZ3Fb6dPRWLTofD100DcpU+yRBvIOj8IKRLojk0dIE6hKlv9FGPDgvjpm3b9n3Wt6O07X7OHF2axtfV1dwxQBYdUYG7Hws1GKj3trUuVYt29lTqvd69V15RDknCLNCb+9bC2+EGAxOtVq7cupUhFgsC/6LIGcHBTAkOJkCv3620bVu+qKpirNXKKNXjVvq6yUFB3J2bi0fT2h7/2o6eysaWKfBx+7s4pCg9oMTl4rmiIv5TXk6MycT65mamJiejF4Jch4OPKyvJczq5IjaWO5OT9zncVUrJKyUl3DmAysqq4YD92GirlREBAXxVXb3vjXb0VPYxG21OaSl/jo8fMFOFld4npeTf5eWkrVqFHliVns6mKVOYGhxMocvFXcnJvDpiBCvS0/lj8mQ0YOKqVXxQXt7m/v6en48GnB4ZeTBfRq9Sf6393M2JibxaUtKp59q8Xj6qrOS6HqijrChtkVJyf34+TxcW8svEiTw3bBiDAwIQQvDJ2LEsb2zkL9u24WsZrz0kIIAXhg3jxwkTeLyggIfy83fb1wN5eXxaVcU348Z1atZlfzVwXukh6syoKCo9Hv6vuLhDz9Ok5JqsLM6OiiKxAzMuFaUrXi4p4buaGhalpTExKGi3x0IMBuZPmkS2w0FGZiZvl5Vhb7loPjk4mMVpaXxeVcVLRUV8UF7O9NWr+a2+nsVpaUQPsFSfynH3MrvPx7c1NRQ6nbg0jXCjkWPDwvY/NrsVo07Hd+PHc8SaNZh0Oq5vR+/Zo2lcl51NudvN+xMmdPUlKEq7bGlu5vHt21mZnk7kPmZJhhoM/DRhAj/X1jK7tJS/5eZyWmQksS0LKYwODOSO3FxmhIRw36BBzIqIGJBpPrWQQi/Jczh4taSEf5eXkxEczDirFbNOR7XHwzc1NYwKDOSmhATOiY5u1wofOXY7p27YwMSgIG5NTOSI0NC9qqy5NY0vqqp4obiYWJOJj0aPptbr5avqaqo9HkxCMDQggDOjovxX8hWlG/1pwwaOCw/ntg4M2dvucPBzXR11Xi+alIQbDOQ5HOQ5nXw2blwPtrb3qRVw+pgfamq4fOtWroqL44aEBFL3qDPi1jS+rK7mmcJChlgs/Gf06HYF0kavl/fKy5ldUoJRp+OsqCgijUa8UlLscjG3spLRgYHcmJBArMnE80VFLG5o4KyoKJLMZjxSkmmzkdnUxJVxcfwtOXnAnYIqPWN7S/qjcPp0ArvYKbB5vQxavpwNU6Yc0mk+Fbj7kF/r6rh482a+HDeOGaGh+93WpWlcvmULdk3jy7Fj231KKKVkfn09C+rrqfN6MQhBtNHIWVFRjLZaeaesjPvz8nhsyBAuiY3FuscfUq7DwfNFRfxUW8uPEybsf3amorTDS8XFbGpu5o2RI7tlf1dt3cqU4GBuSkzslv31RfsL3CrHfRA1eL1ctHkzn40de8CgDWDW6fhg9GhOXr+e54uLuSclpV3HEUJwbHg4x4aH7/XYF1VV/D0/n9/T0hixj4A8NCCA2SNGMKekhJPWr2f55MnEqJ630gWrbDZmtqf+yQFq6+wwNTiYVTZb9zWwnxl4Wf1e9H55OceGhXFUBwr4GHU6nhs6lFdLSvBqWpeO79E0bt22jc/Gjt1n0G7txsRETo2I4Nmioi4dV1FyHA5GHqj08I7aOl8lwbyZ/tv7MCowkG0OR/c2sh9RgfsgkVIyu7S0U6d2acHBJJnNXV6a6ZuaGoYEBDC9Hb39Hf6anMx75eWqlonSJV4pMR0o1ddWbZ19MAqBdwAvAKIC90GysbkZt6Zx5L6C5gEKxV8VF8cnlZVdasNbZWXcuK/hgvs4fmpAAFOCg/lif7MzFeUAIg0GKvZXARB21dYRhv3W1gGo9Hj2OaRwIFCB+yCp9HhIsVjaXgi1HaeIKRYLlV0sEp/jcJDR1sruBzh+enAwOQP4tFTpurTgYFa31MXZpx21dc4shuMX7DfHnWmzMXmPCTwDiQrcB9E+P4btOEXsjgKcbk3D1NYfwwGObxICdxfz68rAdlRoKN/X1Bx4wwPU1gF/2vH72tp9n70OACpwHyRRRiNFLhdtDr9sxylisctFVBdPDaOMRopdrg4fv6Qbjq0MbCdGRFDudrOqsbHL+1re2IjN621z1NRAoQL3QTLeakVKyfK2PrjtOEX8d3k5Z0dFdakNZ0dH835FRYeO7/D5+Ly6mjO7eGxlYNMLwT0pKdyWk7OzgFRneDWN23JyuDclpV0zig9VKnAfJDohuLFlYd427ecUcWNTE9scji4Hz2vi4vi0qor6tnLl+zj+3MpKDgsOZkgnVpFXlNZuSEjAIARPFRR0eh+PFhQQajBwTXx8N7as/1GB+yC6Ki6O72tq+KMDp4s+KbknL48bEhK6XLYyzmzmguhors7KalevJ9fh4IH8fO5u58QfRdkfnRD8d8wY3i0v57nCwrbThvsgpeQfBQV8VFHB+6NGtX2RfwBRgfsgijAaeW/UKM7YuJE17Zj15dU0/pyVhUvTuLebgudLw4dj8/k4f9MmGvaz7NmqxkZmrl3Lw4MHc/RBXvFbOXQlms0snDSJDysrOW3DBoqczgM+p8Dp5OT16/m8qoqFaWn7XAlnIFG1SnrB51VV3Jidza2JiVwbH0/cHh9En5T8WFvL04WFWPV6PhkzhuBuXBPSpWnctm0bH1dVcX50NFfExe1WZGpOaSlb7XZeGjaM82P2PZZWUTrLo2k8VVjIi8XFnBgezvkxMaQHBZFisQD+YJ1ps/FxVRW/1tXx16Qk7klJGVCLJagiU33Q5uZmXiou5pOqKo4PD2dsYODOsq5fVFcTZTRyU0ICl8XG9li94XKXi7fKyvisqspf1lWnY2hAAH+Oj+fMqKgDz3RTlC5q8Hr5T3k5P9XVkWmzUdYySSfBZCI9OJiTIiK4LDa27dXfD3E9EriFEG8DY4DvpJRP7Gs7Fbj3r8Hr5dPKSopcLlyaRpjBwLHh4UwNCentpinKQae1xKOBPGJkh26vDiiEOBvQSymnCyHeEUIMl1Ju61IrB6hQg4Fr1ZqPigKogN1enT3/mAl80vLvn4EjABW4FaUPk1Lye0MDC+vrybTZyLLbcWoaJp2OVIuF9OBgDg8N5cTw8AG5HFh/0tnAbQV2LC1eC0xu/aAQ4jrgOoAUNZRMUXqVW9N4o7SUV0pKMAjBaZGRXBobyxirlQCdDremke1wkGmz8URBAddnZ3NdfDy3JyV160Vxpft09n+lCdgxIyOIPYYVSinfAN4Af467061TFKVL1tpsXLl1K3EmE2+OHNnmWqQAo6xW/hQVxaNDhrDWZuO5oiLGr1zJ26NGcdwAnlreV3X2fCgTf3oEYCKwvVtaoyhKt/mgvJwT16/njuRkfpgwgSPDwto1cWVScDAfjBnDnBEjuHLrVp4qKOjQZBml53W2x/0VsEgIkQCcAkzrthYpitJlH5SXc29eHgsmTWKM1dqpfZwSGckfkydzwrp1+KTk74MHd28jlU7rVI9bStmI/wLlcuAYKWVDdzZKUZTOW9fUxB25ufw8cWKng/YO8WYz8yZO5J3ycr5Vi2n0GZ2+dCylrJNSfiKlLO/OBimK0nkeTePKrVt5JjW1y0F7hzizmXdHjuTG7GzquriYh9I91JgfRTmEvFFWRozRyJVxcd2635nh4fwpKorHu1DZT+k+aqyPohwipJS8WlLCnBEjeqR63j0pKUxetYrHhwzBqtfvvL/c5WJRQwOZNhsbmptp9PkQQLjBwKSgINKDgzkqNJQwtRhHt1GBW2mT1CQIBnz5zP5kcUMDAv8yYT1hkMXC4aGhfFpZyRVxcSysr+fV0lLm1dVxZGgoGcHBXJ+QQFjL2O8qj4fVNhuvlJRwxdatnBMVxc2JiaS1te6p0iEqcCs7SU3iynThWuVCq9HAAKbRJizTLehj9AfegdKrfm9oYFZkZI9+2c6KjOSnujq+qalhY3MztyUl8fbIkfssAnVOdDQAFW43b5eVMWvDBs6KiuLp1FSC1OSeTlM5bgXwB+3mT5vxbPEQeGogYQ+EEXpLKPooPbb/2PAW7rt2t9I3ZNpspPdwb9bl8/FZZSUjAwNZn5HBzYmJ7arcF2sycf+gQWyaMgW7pjFh1ap21aRX2qYCtwKAe60b6ZAEXRKEcZARIQQ6qw7L4Rasf7LS/HWzP32i9FlZdjujAwM79iSpgaMC2jHB5ouqKp4oKEAnBP9ITcWi7/hZWLjRyLujRvF0aionrV/Pim5YPHggUoFbAcC12oXlCAtC7z/N1jSoaPl7Ng43IgIF3jzV6+7LnJpGQEeKQ0kN5h0DXyXBvJn+2/uwqL6eG7Oz+XHCBNxSdnkm5XkxMbw3ahR/2rCBHLu9S/saiFTgVgDw1fgwJPtPeTUNjjkGkpJg5kz/bUOSAV+1r3cbqeyXSafDpe07+O7FWQXVS0F6/b+dVW1u1uT1csXWrbw9ciRjrFaMQnRLHv3UyEjuS0nhqqysnXW4lfZRgVsBQJgFWpP/j76qCpYuBa/X/7uqCrQmDWFRI0z6sqEWC9scjvY/wRIDUTNAGPy/LW0vU3dvXh5HhYZyWlQU2Q4HQwMC2tyuM25NSgLg/0pKDrCl0poK3AoAprEmXKtdAMTEwIwZYDD4f0cFanjzvBhHqHG4fVl6cDCZHbngJwQcPx/OLIbjF/hv76HU5eLDykr+NWwY0HIBNCiom1rsXzjhtREj+EdBQcfOFgY4Fbj7sBqPh/vy8khaupSA338nbdUq3igt7ZHTSstUC+6NblxrXYBk/nwoLobfvtFo/rQJc4YZXaD6uPRlh4eG8nNdXceeJHQQENtm0AZ4q6yMC2NiCG+ZPPNzXR0zunmc+FirlXFWK19UtZ2qUfam/hL7qEq3mxmrV1Pr8fDLxInUHH44z6Sm8l55OVdu3drtZTZ1oTqCLwnGtdJF46uNOP7XjHV+E7Y3GjEONWKZaenW4ynd77jwcCrcblZ140iNd8vLuT4+HvCPxf6hpoaLYtpOqXTFDQkJvFOuyh61lwrcfdQj27dzckQEr48cycgAK7ZqPceHR/DrxImsaWrih9rabj+mPkZP8LXBWM+yYkg2YBpvIvTWUAKODlAzKPsBvRDckJDAc0VF3bK/cpeLRq+XiS2pkZeLizk3Onpn77s7HRMezh+NjeoiZTupwN0HeTSN/1ZUcE9Kyl4jPMxCz+1JSbzbQ70TIQSGRAPmNDOmsSaEWQXs/uTWpCRW2mzdUoI1s6mJ9OBghBCstdl4s6yMR4cM6YZW7i3SaCTCaCSnIxdXBzAVuPsgm88/7C7BbG5zhMfIgABKXK5uO169x8N/yst5u6yMsm7cr3LwWfV63hk1ihuysyl2Oru0r2y7nVGBgdi8Xi5vKRWbaDYf+IkdmNTT2ujAQLLVmO52UYG7DwrR6zEIQZ7DsdcIj5gYWNvUxBBL9+Scf6mtZdiKFXxRXc2vdXWMXbmSd8rKumXfSu84OiyM25OSOH7dui59wTs1DR1w2oYNzAgJ4Yr2lIrtwKSePQXodDjVyJJ2UYG7DzLodFwZF8dj27fTeoTHggXQ4PXwYnEx1yUkdPk4Tp+PS7ds4ctx4/h8zDj+FTmG5WmTuSs3t8u9NaV33Z2SwlXx8UxfvZp5nbweUul282FlJaMDA3m1vaVi2zmppy0eKTF1ZObnAKbepT7qocGD2Wy3c+bGjSxsqKM5xMGHFeXMWLOGM6OiuqV05+8NDYwIDOTwkLCdefQ/nxrIGZFRfF1T0+X9N3i9/Leigv+Ul1OrVk456O5JSeGNESO4OiuLP2dlkdfO/HG5y8X9eXm8U17OILOZOSNGoG/vxel2Tuppy3ankwSTqd3bD2SqrmIfFWIwMH/SJN4qK+Pu3FxqvF5GBQbydGoqp+2ndKcmJbNLSvi1vp5oo5H7U1IYvI+Zbnoh8ErJT4WN/H5OLtzTxO85QehtOg4L6VqVuZ9ra7lo82aOCA3FIAS35eTwzsiRnNlS5lM5OE6OjGTDlCk8WVDAYatXMyU4mFmRkaQHBTHGaiVQp8MlJdl2O5k2G/Pq6vipro7zoqP53/jxXLZlS8dGFO2Y1OOs8gftdj7X4fOR43Awvhsn9xzKRHePB95TRkaGXLVqVY8eQ9nl3txc5tfX89ekZP6oaubjxjIyMzKIbaMn49Y0UpYtw+7zYV4XSXVyPcLqQxo1Vk6eTEZICJqULKivx+bzMTMsjNB2lPB0+nwMWr6cz8aO5fCQMKqqoCjAxonr11EwbRrBqg5zr3D4fHxeVcXCltVqsux2nJqGSacj1WIhPTiYGSEhXBgTQ5jRiCYlEYsXs3nqVBLac1GyC36vr+eOnBwyMzJ69Dj9iRAiU0rZ5hui/oIOIVJKXikpIWvKYVx8spmlSyHiOQefp1RxU1LibtvafT7+r6SEeLOZDU1N+CbWEJQTTJO+CYPbwB05uSxMm8S5mzaxze4gUpi43ZfD4rS0A44sWNzQwPCAgJ0pmKVLYcaMYKa8HMy8ujrOUr3uXhGg13NpXByXtnM9Sp0Q/ip+5eXcP2hQj7btnbIyLuiBiT2HKpXjPsRoQEOt2DmEsKpcR8Me5Ss0KZm1YQMrGhuJwx+EZwSE0fReElw4He8fYWxoaua3ujpyHQ7C7klnyYyJeH+N5tnCA0/uMOt0NGvaXkMZG50a5lYXn/IcDj6trGR5Q0O3zwRVuseNCQm8VlqKtwdHe9R4PHxVXc3V3bzA8aFMBe5DgNPn44wNG7D+vohks5mbKjYx+tJadOcXYZhRw6VDInfbfqvdznaHk+q/jOWX00bg88Fapw2WRkJaHUypI1xvwObzEYmZ5Yt1eL1QutpCZdOBa3LPCA2l0evlB62c6TMkeoNk+LWVFPocHBcejkfTuHrrVg5bvZqPKiu5cutWMjIzKVIjWfqcycHBDA8I4OUerN73YH4+F8bEEKUuTLabSpUcAj6rqmbhKh/uO6dT8upaDptoQXdrIbM0I/8cOYlki4Vch4Nbtm2j1uHjxpQ4mrw+lmZq+JrM8EMc1aeVw8+/Q7UZo9Dx2NDBzAwL43ZvDvF/z6NkjRn9ldu5ZtCYA7ZHLwRfjxvHuZs2IZ8pINUncOk0vh4zDrNOx5MFBRS7XBRMm4ZF6KmslLzlLOTiLVtYlJZ2EN4xpSPeGDmSwzIzmRUZyciOrrBzAL/W1fFdTQ0bpkzp1v0e6lTg7oe+q67h0+Ia/pIaT0ZIMLpmAw16N1y4nebYZjJrBCunpxFo8C8t5ZOS8zZuJG+9kcbVwayctY1LB0fz+ZuraS4xohvXyAPJg6jyemgI17g0OZpTo/y99EVpaTwTWUTV6Y38edAYjosIb1cbxwUFsXnqVNY2NaFJSVpwMHohKHI6ea6wkBMjIviqqpo5F0WzbLFg7IWhFF1fxJdVVZwVHU2R08kvdXXogJMjIojr4Ytjyr4NDQjg0SFDOH/TJhZOmkRYN9UqyXc4uGLLFt4aObJdF72VXdSokn6myuUhfv5ytE+TMJ5RhuO0GYBk2INF5B9egHFRDJ5RDUz4bQRr3gvjsYJ8HisoQAL8HgWDmiHSzfLx6XzlKee5rFJ8C6IxzKxmw8w0Rlq7t0clfRJvgRd0sDK0mTM3b6LO6+WJIUP4vKyalSsAswYWjYhUNwadwKLTYfN6OTUyEh/wY20tNyQk8NSQIarYVS+RUnJHTg5LGhv5ccIEIrsYvHMdDk5Yt46/JiXxl5bFFJTd7W9Uicpx9yM1Dg9zltXj8whkuBu3TU9VFeh0gpwnUrgrejCeYypAwKavg6iolDxRUMCU56eBBCbVQZgH6kykmAKoavahfTAI+dxIvJlh/Fqy+1XMfxYUYP39dwYvWU5mY8dX5PZWeGl4pQHHQgeOeQ6C33HxdsxwjgkLw+IwsiQjDcNwO9SYmfrZeHwSro6Lw6VpnBEdzQdjxvDRmDFsG5NBcZ6dd7NKu+mdVDpKCMG/hg3j+PBw0let4teO1v1uIaXkw4oKZqxezT0pKSpod5LqcfdBUko+qqgku9bNDUNjiTObqHN6iViwFEwaNBgQ3yYy2h3G+n+HoW9Z4FdKOOJkDysW6Dl8mo4FC2DaH6v5Y7mAkY3+r2m7gfT/TGLlZ1a+r6nh7KVZeBZFYji6mqzjJjOkZbJOjt3OjDVrSP1HBitFLUHnllF32WQ6MiO58a1GzBlmzBON1DeV88TX9TykS+bo7zTWnreRQasTqD6+iHGmIDYUenH8LwbD+SXMP3wcp2xcT9nEaTi/caEv8+IIlThqvUQnWwicFYg+rOMrjCvd48eaGq7LzuaE8HDuTk5mlNV6wOdIKVlps/FEQQH5TifvjhxJRkjIQWht/6V63P3MPwoKuW5+IY990ETqt2tweTV+2WL3pxT+OQrCvATMqGfzRRtJfXw7O0ZqCQGLfjBSUugP2kLAvPQJjN6ShP6GKUx/9nAKD5vOys+sCAGzoiKZd+RY7rvSwumDQ3lwawHVbv/UdK+U6KRg1SI9WqOeRrukIwuUSKfEV+3DNN4A844h4H/D+CCuGG+el42fhMI9EygIa8ChaWz3OHG+OQj5SyyeZh1DXSFYpI6tT9mZ86GOC34IJfbacKZNy8KToqPpP01Ipxo+2Ft2zMaMN5mYuXYtx61dy8vFxSxpaKDZt2tB6XqPh9/q6ni2sJApmZlcuHkzR4eFsSo9XQXtLlJXBPqgX6rqccweglwciePzpWwqd3P2hGB0Hwai3bcVqk3Yo5thbRiFumY2b4axY/2BWqeD2Nhd+7LqDPz6cDTiEf/9e6aIjwwP5ZOqShb/oKeqSmPBT9sp+ttwRgYGcnFcDC99thTsOiZ8Po6YG9pu75KGBubX1RFnMnF5XJy/UJARhF6gVVajr16KWXq5tW4NNZZJTDnOw8pfgxm1IZlNk+t5Z/RInnZHssTpgVAva421nFMTRnm14O8/BmAwCLLKXDh0GtYZFjyVDlzrXFgOU6vy9JZQg4EnUlN5aPBgvqyu5re6Ot4vL2dDczMSf2bOJASTgoJIDw7m8SFDOCkiAp26RtEtVKqkj7H7fLxaUsJDq0px5QZgTfBSd9FkDDpBld1L7OKlsDgKkeBA8wFD7IhvEzhy81A++kgSHy/wapLscg8jYo2MuaeMvC9DmRprZfFif+CuqvKXh93xN3TLhlxe/bEJCYicYMoeS90Z/Js8PhprdMTHir2Cvk9KbsjK4qPKSs6Oiqag2Y3JCD9MGI9Bp8Ox2IFnkxtL6D+hMQ97w8N8PtbKX4MLCRR6LAYdR4eGstJm44Whw0hxBnN52Tq2ORwsLhvDN18F8fCnZg6foTH9oScocbl437gYd/LPuFa7Cb64a/VUlO4npcSlaeiEwCiEupjcBftLlajA3YucPh8rbDYiDQbGBQWxuL6eMzZuxK1JzouOJkMfzqVDIgkx+k+Miss1kn9eCWFusGjg0UGTAdw62BwCR1Yz6f2JlBxeRNWYKlK/GEneeVmwMRi+T2BaXTzOQY2stzdxeEM8C+YLdDqwe32MeayIokKYXpTMonn6A9YGklJy7Nq1LGhowIp/pqR4dSiB51bw5YlDOSEyHCkl7o1u3BvcCNyYJgdhGmWm0eul1uMh2WJBB3xQUcGLxcXkO50MCwgg3+Hgg+2pJCQHkJ0MXzdvZ2nFZn6vvo0E2YB7TAmuzQEEX6QCt3LoUrVK+qBfams5a+NGNMCA4K7kZDY0NxP5RSp5H0by7w9W8NZxoxBi1xdrYqyOw9/PYEllI7ywHgJ8YPZBuQWG2UDCuion1EuQgu3rjQyvnsi2M7LgzBJW3RyP97w8mFzP0ksiqKqyEBsLgQY9eY8M3q0nnmmz8XllFVNEBPZAF/fk5RKpM/Hp+DGMsAayzW7n94YGsOlpvnYKnFuEvCYf++ZQyut8EOkfiWAeb8Y8fvcx2CEGAyGtxu1eFhfHZa2mO1e63fwkKwlZ4+SFoDJOi4rkxfL/ECEbIGoG7q0BmEaoWXbKwKV63L2gzOVixIoVjAq04nhmGJtmZSESHdwck8Srv9mQeVaY0MB906N5tno7o0xWfp08gRizCU2DD9Y2cEXuRjBJqDVBnBOunoIu2cEMSzgYJMu2ujl8uIVff4XpJ3lYkwlTRhtxJzaxekQR0WGCrbcPJcK093jcarebUX/8QeD8eIrGlyMCvUx8J4315loipzRTftNYNtmbmLBqFXyeAEPssC0Izi3GbDNTempGm/vtCKlJbO/b0EfqCTg2AF0gaPVVODOD8WzzEHJNCMKkTsOVQ1e3jSoRQoQKIX4QQvwshPhSCKG6PZ2wpqmJJLOF3OVmNn0aAv+LRwrJXyJTGFIeiXDrmPrNWJ6t3k7GM9PY9GMgMx6qRNP8Fx8vmRTCoHVJ8FMcpkWx6O+fwGGDLRR/HcHvCwUL5+koWWNhwQL/kmcvfGpH+3QZKyLLMDWY4bgKqmIaOey+Kj6rrCJ88WKmr1iDzeuvQ1Lt8WBAR+mcRKg1Ib2C9cVutCAv1WU6qqqgyeslWK+HY6ohxAPnFRNpNLDpxEldDtoAQif8qRAdNM5upOFVG41vmpE2SfDlwSpoKwNaR1MllwAvSCl/EULMAU4Gvun+Zh3ahlgsVLnc1AUBr6+CwXaCioMZcayRbU8lU1UF0dGSUcsDWDExDzm2gfwX4qiq8o8MyXE4+Or6OOKMZiIjYcK1Naw4fzGz/jqR917X81lxDfeMSEQI/1jnhgZ/Thop+WO+AZEWj0xpJn9uBC+cv4XYucNZPnU7cdtXc+6IMN4YP5QLYqOZ/fYqxJIIxixJpeDG7TQXGZm6aCQfe4p5Ia+I4cZAtkXbCYyEo6OieXfUKAL13Te+WpgF1llW5PESrUlDWAU6ixrBqiidTpUIIT4DnpNSLt/fdipV0rZXiku4ZfM20IPQBFEWA5fHx/HcsKE7tyl1ujji0QoKFlg5whTJggWQa3cwcslKtGY9R740g48/EiQf2Yzvqjz0rw4n5IFt1I2tYeQXo9j8Yhw6nX9izsyZ/tKq06f7c9hLNniYOFVj3D8KeL+6DATw5hA4qppRWxLZ9LJ/WMmOvLeUu/6dkbkK30vD2Dg3FMMnK8g8YTxjgw48CWNPTV4v75aXk2mzMdpq5dr4+C5PpVaUQ0WnL04KIV4HRra66zcp5WNCiOlA+IGCtrJvf0lKJNZo4JbsXKz/Syb/8zBe/L+1XBgdTUaof3JCgsVMzpMpu100dNXr0RoMUBrA0iX++w5PtLL0kfFMmQIr3kyGoyzkfBBJ1QO7xm7Pn78r8K5pbOKwJWtZLSWrSwRkh0CKHUY0QbSL7HdNO3v3O4YFrmhs4J7SPExFeuKx8P3QEuSZNnz4MDWaoYMrTtl9Po5au5YUs5nTo6JY3NDAlMxMlk2e3OZqPYqi7NLhHrcQIgL4GThHSlmwj22uA64DSElJSS8oaHOzAU2TknErV1LqdNOwJAQy6gBJmNHAiimTGbGPYk9SwtEzJcuWCmbM8K/8vqM3HB1NqxVn4J3vHawot3PekHCMreaqP721hPu+rEXadTCtFn6PhhAPsd4AKm0+0rel8MdXAbsNCRy0bBmWj4awzWknbIoNa3kQJQ43k/KSyPwouL1LC+70emkp31ZX8+348UgpqKqCh+uziTL6J3YoykDXnRcnTcCnwH37CtoAUso3pJQZUsqMaLVMVZsKnU7qvF5kjhWGNoFeYsiMpP6zWE58upLMRhtXb9nKQ5sL8Wq7vlyFgAXzBVsLvMS9uokL1m7BJX3ExvovXM6fD8XF8PXPXkbPX80li3MZ+uSuafEAV6dGExLng8HNGH+LhbQ6AgY7qZlaDmaNddeuocmz+4IJjR4fufOsyKIA6uwaf1w7lLLbRncqaAOsa2ri5IgIpBQ7V5hf9HwEa5qaOvuWKsqA0dErPdcAk4EHhBALhBAX9ECb+rVaj4cVjY1Uu9373S7aZMLt02j6MAEy/TWuvYsjYGotBR4Hx61dx4L3A3l8YRWj7y7dLfDqdLBSX8v/Ntn5dEsDU//csPPxHVPeS6s1PEKDCjPFDR6qqsDt09hW6iXKaKL2ikmUnzaVP18niNkeieP3CLwGHzLXiifIzeClK1jW0LDzmHNGjkA8tw6u3M6kFUOJi2t7Cn17jbNa+bW+frflzbYE1JEqOp4rV5SBRo3j7iZSSh4rKOBfRUUMD/RPULkpMZEn91NDemFdPad/l4utGRJqQnFENlOX3EBAkxlHjAPqDbA6HFEaSNmTQ3arQbKpxM24rzaCS4f+0XGUZBt2e1xKmHRlHRs9NqZVJ/D9/yDhy9XYw5wM+2UoWc8kotPB3Ru38/wv9cgaIwxvggQnxvlxeNeHEPanKqqvnbCzIqCm7T1dvrOavF6mr1nDeKuVNa9GkmVuwHRUDbknTybRohZNUBRVHfAg+Kq6mo8rK9k6dSor0tJZknoY39fUMLeycp/POTo8jPqL0yk/M53i+4bxxlkJTI0IRjNqsCgSQryQUcdhZQm0XgC7xOGizOPiyE/SMNwzicMnGdhzgexil5OLHrXx3t2hLPrRwPJSO3bpg9lDyU2s2lnp7/HRKQyqCUdUBTDtv5OZGhCK1y6QGbXU5RvJLHHsXMh3R2++O8pPBBkMLE5LY1JQEONurOaOq43kn6KCtqK0h+pxd5PzNm1iVkQEl8fG77xAOOy6CoZeX8n/Joxv1z7yHA7SVmbSaJNQbYLyAESTgdKbx7BjRvgfDY0cvmQ9XjfoAjUOCwzlp8PGEWzcNX5aSsnQFSuwZQZRnVRPxr8ns/gTC8lztlAVZWPcvOGsfytyZwBu3ZMuc7mY8mIhpToH+gkNRFh1HBUeyjujRu02TV1RlJ6letwHiRBit5xtdpbA5W7/F2NqQADzJk0gpNoKMS4I9TBl/a4UiZSSf+YU490UDDYjml3HsnU+pt1Su1sO/N2yMvKdTqoH1YEUrMl3U1+jo/zmsZQfO223oA2796QTLGby7x5KwGH1TH4tg+rXk/i8qproJUu4dPNmvK0PtId6j4csux1Hq5rMiqJ0PxW4u8mFMTE8W1gIYW5mzAB9uIfAqwu5Iil2n88pd7k4ds1aQn9fxFkbNmLzepkSEkLdZZMpnXQUZWems7zVsLwnCwr5YbsNJtVDggP0QKKDrO+Cdlvk4JXSUpLnD4JKC5h9zAgJJSam/akOnfDXU86ssCPPKIG8QDwPjuV/y928XlrW5nNeKCoiZflyZq1fz6Dlyzu9tJWiKAemzn27ydlRUaxtamLUyj8Y9UIgQc12rkuM55LYmH0+57acHLZ9H0zzC2NY8nAO52ib8GqSITorL49NxWrYffr495W1uJ8bDnkB8OEKxv5nPFsXWjh8lHm3HPdwvZW15ibICYI6I8/+x4mGBT3tS04bdDqeTB3C3x7e7L/KmRuEXBqBbZCdjRkO2GOZwPl1dbxcXMzGjCmYGy1sMtZx4ebNbJk6Vc2EVJQeoAJ3NxFC8PiQIdyWmEiWw8HwgABiDjADMMfmpOR/scgmPdWbzCyeWM3Q/4xlwaAyfvoun8J7h+22xuP58dGsuTsbZ6WR6K3RrPsolOrqvUd5vDN+BH98Xsz2eg/mjAbOKFzD2NpAfpwwYbeJOPvz1+RkpgYFc9qGjcQVx7JtcgPGc0qZlTB8r22XNDRwYUwsl51saZn8E87wfwWwqbmZo8LC2nW83uLw+fimpoYipxOrXs/JERE7191UlL5KBe5uFmUyEdWOKdtSSqxmHfKpjeAFpI5JlmBW/jsSOcNH6anlO6ed73B7chKTg4IoqPFyYWoE+j2WKdvBatCT+9gg/pVVxj9/dVF1wzB+f28lfyGPl8anYtG3L3gfER7GtxPG8ffgfAIu1fhLyiBOi4rc+zUbjSyprmXJUokvwc7ieg8xdmef7m1rUvJUQQH/Ki4m3GDAqNOhScnf8vI4MjSU10eMINmilkZT+iY1qqSX/FJby23btlG60UzD4HrQQYhej3l9BFXx9SRkx/DhDdHMDA9r1/7yHA4ezt+O3Sl5fMQgxgRZ+Wl7Iyev2eAvIBXgg03BxGmBlPx1ZIdWaz+QZp+PKZmZbKvy4NU0dBZJoEXw64QJTA0N7b4DdRMpJX/OyuK72locPh+Xx8WRHhyM3efj48pKMpuaCNTpyExPJ0kFb6WXqFElfVClx4PQdDQ0SzhzBpSZabbDLacGERcrSJ/l5OrNWTy+ffsB9yWl5MR161j0cQBfPRdE2q/rcHg1ThwUwoQvx/jrZd+QBm+nUh5m69Bq7fvT5PXyakkJd+bkIKVkenwgVyTF8kzyMN4aMYJzNm/Gs59RKL3lx9paPq2qYpzVSuH06bw8fDhXxMVxY2IiC9LS+H78eJp8Pi7dsqW3m6oobVKpkl5yYng413uyCA4OwnbHNmgy4ms0UZPoY0ZYCNU3j6Mw38Hjs1fzQMrgvXrIDp+P67OyWVLfyLERYZQ4XXj+OQjNDe5zi9ha7iYtycKa98I5Z00Mvzy1lWadl9Q1SXtN1mmLlJKPKitZ1NBAnMnE9OBg/paXx3ank7FWK/83fDjXZmWRZDYzURfCNoeDMIOBnLuG8p+mRlKPdBB8gZ7F9fUcExHRM29iJz1VUIBJCL4eN25X/XCpgbMKLDEcGRbGWyNHctmWLZQ4nSSqXrfSx6gedy+JNpl4OjUVywgHcRYT4vt4jIlOZsQEsbHRzpIsF74x9XgqTG32kJ8uLOL7hV4KLhvHp8vsJFsshL20EfHwZoIcFsYn+Gcg6nTw2eTRfHHiUL4/bCw5/0hu18zHR7dv5x+FhYwJCGRVTROnbtjAnUnJLEudxqWxsZywbh0RegP1fxnHP2YkgkuP0y1Zcu1KtOtyyNXbyLE7eGD7dpx9aFy3lJKljY3cnpy8e9Cedwx8lQTzZoLUuCAmBotOx1tlbQ9/VJTepAJ3L7opMZH7UlKIPaGew+6vZMnR4zkvJpozYyPh3T/goiIm/zyqzR5yfoOLukWh+PKsNK4M4URrFA/NCueR80MoOn8iBp1Ak5JH8vOZsHIlj+cWUmxsYkVjAwe6ruHVNJ4uKuLn8RP57NIkvn88An2DiSefhAmDjcy9OBGrXk+UtLBsqcDXaEBbGU6h10mQZkDcmM5gZzBJZhORRiPPFRX10DvYcRLQgFNbnwU4KqBqEUiv/7ejAp0QJJvNZDscvdVURdknFbh7kRCCO5KTWTtlCsumpjElJAQhBE8PHYr7pCMpP3kqq+buKpvq0jRy7HaavF5uSU1Af0mRP8CfXcwmbyNHhYXy0Jhkwoz+DNibZWV8X1uL7rVhLC5r4oZNOVy0cQs3ZGfvN3h7pUSTkuwKN0u229E84LYLsos0vF5YslRi0HSs8zQy/QgNgwGmLBtGrc+LTLZj+Hw5+eNLiXh+AvcnD+Lj7kqqdwOdEBiF2CMgC/whnZbfAikl1V5vnx4ZowxcKnD3UXvOclzZ2Ejq8uWcsG49SUuXU+B08ubkoUSmenh/7ChODYjl5PXrqWpVTnaVzca51jg2Werg5zg0TbL92WTezq/kX0XF+wzeTT4fATodswpWo3tlDZxXBLEuEtMd6Mc2Ev9wHgFGwSCLGdszq7kmM4emh9ahA74fPBnt5jS4Lp11X1ux1Qt8PTxyqaPGBAbyYuuzgIBYiDoS0Pt/B8SyrLGReq+XC1Q9eaUPUhcn+4kLNm/mxaHDeeX8aIoqbFz4wjquGRrD3YOSefPCWJYuBesblawe1cRJkf40wNTgYF4rLSVyrIXqJh/4dHBSGT6n4JWiErIcdl4bMWKvsrO35ORwUUwMdp/GAn0DTWEepoVEYD7bQe6J2UwMtfLc0ElEGY38XFvL+uZmzk0aztvl5fzgreTw1FSWlsP0wyXvNBdyTh8Lfk8OGcIZGzfyYXk5l8TF+b8dT1iw8+JkudvNBZs3E28yMaMPDmdUFBW4+wG3plHodHKkjOLipeDzBkOFGUOSnv811LJsVSK+aDcNYc0EN1ugZY7MtfHxVLjdvJ9eTr3ThXTo8FUGAILYVyfww2OrWNfUxKTg4N2Ot7KxkW/GjefGWVZKl8KYi+tovG07iyZO2KttJ0dGcnKk/4BjrFaOW7eO2Bcb+LM+hGXuOkrdet4aOXKv5/WmUyMjOSkigmuysvi2poZbkpIYGxhIPSH8t7CQF4qKcGga/xs/fp+11BWlN6nA3Q+YdDpGBAbynVbOjBnxLLHVI2JcPDQyiTtyc1n61RLwwrB5Q5l+5q61KoUQPDh4MA8OHsyzBQW8VlxOflYw8p8jWeU1ME0fQIXHs9fxEs1m5pXYWLrUitcLG302TufAs0ETzGbWZ2TwbU0NOQ4HZwalcnx4OLo+FvyEEHw1bhzXZWfzcWUlv9TV4dA0jEJgbRlp8vnYsRwTHt7LLVWUtqmZk/3EpuZmztiwgSqPBwOC/44ZszMlYvP4aKgRJMbq9jnUL8/h4LDVq0l5eQLrvwhm3PkNFN+0kXUZGSSYd1+8INNm45T169GtiKSyVsM4tZ5Nx6cxLPDQq+FR6HTybnk5OQ4HJiE4Pjycc6KjMXXn1FJF6YT9zZxUgbsfkVJS6/USZjCg70Qv9tPKSv6clUWQMODAx/ujRzMrcu/aIwAFTiffVtdgb4LLh0QTZz5wj1tRlO6jAreyk93no9ztJsFkwqLXH/gJiqL0iv0FbpXjHmAC9XpSVdlSRenXVCJPURSln1GBW1EUpZ9RgVtRFKWfUTnuQ0Cew8F/Kyqo8XpJCwrivOhoAtSFR0U5ZKkedz/3QlERUzMzqfJ4SDKb+aiyktF//MHW5uYu7benRxspitJ5qsfdx3g1jW9qavhPRQUVbjeDLBauiYvjuPDwvaZfL66v58XiYtZmZOxcYuvO5GTeLC3l3E2b2DBlSoembFe43TyyfTtzKyuxeb0cGRbG/SkpnNDHFkJQlIFO9bj7kCavlxPWr+eZwkLOiorimdRUjgwN5ZacHC7bsmWvKnuvlZZyV3IySRYLmgYVFSClv0aJEIJFDQ3tPnatx8MRa9YQoNOxISODpiOP5Pr4eK7YupUv+lBZVkVRVODuU27PySHFbGbJ5MlcHhfHEWFh3JSYyOr0dMrcbp4pLNxt+1ynk4zgYDQNjjkGkpJg5kyQUjA5KIjcDiwCMLukhCNCQ3lh2DASTBYaqvVcEBPL3DFj+FtuLppKnShKn6ECdx9R5XbzWVUVLwwb5p/OLjX/yixSEqDX8+KwYbxSUrLb4ruDLRbWNDVRVQVLl4LX6/9dWSlZ29TE4A6slfhNTQ1XxcXt9SVweHAoQgg2dTFnrihK91GBu4/4w2bjsJAQ/4orbayBOD4oiACdbrde9A0JCTxbWIgv1MWMGWAwwIwZ8KOswC0lR4eFtfv4Ev+HYc8vgepqgY5d68MoitL7VODuIwT+tRABf0H/6qX+NRCrl/pvtzze+mLj0WFh3JCQwKTMVUx5O5fH1pcQ9soG/r49n8/Gju1QOdVTIyJ4v6KCmBh2+xLIszTg0jTGWq3d9loVRekaFbj7iOkhIayy2ah0u8ESA1EzQBj8vy0xZNpsaFIybI86I/cOGsSitDQC9DoK9c2cFhnJ1qlTOxxo/5KYyC91dTyYn8enP7spKJL89bNqzt+8mX+mpnaqGqGiKD1DVQfsQ27Zto0yl4uPxozBKNi5lFajz8fJ69dzfnQ0tycn99jxi51OHszP55OqKtyaRkZwMA8OGsRpUVE9dkxFUdqmyrr2E06fj/M2bybP4eD6hARSLRY2NDczp7SU0yIjeWX48IOymowmJT4pMarFBBSl16iyrv2ERa/nm3HjmF9fz/vl5fxYW8sgi4Uvxo4lIyTkoLVDJ0SfW25MUZRdOhW4hRCxwI9SyrRubs+AJ4Tg2PBwjlXrHSqKsg+dPRd+DlDV+BVFUXpBhwO3EOJYoBko7/7mKIqiKAey31SJEOJ1YGSru34DjgHOAr7az/OuA64DSElJ6XIjFUVRlF322+OWUl4vpZy546fl7tlSyvoDPO8NKWWGlDIjOjq6m5qqKIqiQMdTJccDNwshFgCThBBvdX+TFEVRlP3p0KgSKeVRO/4thFggpby2+5ukKIqi7E+nZ1i0Sp0oiqIoB5GaGqcoitLPqMCtKIrSz6jArSiK0s+owK0oitLPqMCtKIrSz6jArSiK0s+owK0oitLPqMCtKIrSz6jArSiK0s+owK0oitLPqMCtKIrSz6jArSiK0s+owK0oitLPqMCtKIrSz6jArSiK0s+owK0oitLPqMCtKIrSzwgpZc8eQIgqoKBHD9I+UUB1bzeij1DvxS7qvdhFvRe79IX3YpCUss3V1ns8cPcVQohVUsqM3m5HX6Dei13Ue7GLei926evvhUqVKIqi9DMqcCuKovQzAylwv9HbDehD1Huxi3ovdlHvxS59+r0YMDluRVGUQ8VA6nEriqIcEgZU4BZCxAoh1vR2O3qTECJUCPGDEOJnIcSXQghTb7epNwgh3hZCLBNCPNjbbelN6vOwt/4QJwZU4AaeAwJ6uxG97BLgBSnliUA5cHIvt+egE0KcDeillNOBVCHE8N5uUy8a8J+HNvT5OGHo7QYcLEKIY4Fm/B/OAUtKObvVzWigsrfa0otmAp+0/Ptn4AhgW6+1phepz8Pu+kucOCQDtxDidWBkq7t+A44BzgK+6o029Za23gsp5WNCiOlAuJRyeS81rTdZgZKWf9cCk3uxLX3CAP88ANCSJvo7/SBOHJKBW0p5fevbQoiHgNlSynohRC+1qnfs+V4ACCEigP8Dzjn4LeoTmth1KhzEwEsZ7kZ9Hna6l34SJwbKB/Z44GYhxAJgkhDirV5uT69p6VV8CtwnpewLNWR6Qyb+9AjARGB77zWld6nPw276TZwYcOO4hRALpJQze7sdvUUIcSPwFLCu5a45UsqPe7FJB50QIgRYBPwKnAJMk1I29G6reof6PLStr8eJARe4FQVACBEOnAD8LqXs0xeiFGVPKnAriqL0MwMlx60oinLIUIFbURSln1GBW1EUpZ9RgVtRFKWfUYFbURSln1GBW1EUpZ/5f/SUEil4mVFfAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title('局部离群因子检测 (LOF)')\n",
    "plt.scatter(X[:-n_outliers, 0], X[:-n_outliers, 1], color='b', s=5, label='集群点')\n",
    "plt.scatter(X[-n_outliers:, 0], X[-n_outliers:, 1], color='orange', s=5, label='离群点')\n",
    "\n",
    "# 以标准化之后的局部离群值为半径画圆，以圆的大小直观表示出每个数据点的离群程度\n",
    "plt.scatter(X_pred_same.values[:,0], X_pred_same.values[:, 1], \n",
    "            s=1000 * X_pred_same.values[:, 3], edgecolors='c', \n",
    "            facecolors='none', label='标签一致')  #圈的大小是1000*score 标签一致代表判断正确，标签不同代表判断错误\n",
    "plt.scatter(X_pred_different.values[:, 0], X_pred_different.values[:, 1], \n",
    "            s=1000 * X_pred_different.values[:, 3], edgecolors='violet', \n",
    "            facecolors='none', label='标签不同')\n",
    "\n",
    "plt.axis('tight')\n",
    "plt.xlim((-5, 5))\n",
    "plt.ylim((-5, 5))\n",
    "\n",
    "legend = plt.legend(loc='upper left')\n",
    "legend.legendHandles[0]._sizes = [10]\n",
    "legend.legendHandles[1]._sizes = [20]\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看出，模型成功区分出了大部分的离群点，一些因为随机原因散落在集群内部的“离群点”也被识别为集群内部的点，但是一些与集群略为分散的“集群点”则被识别为离群点。  \n",
    "同时可以看出，模型对于不同密度的集群有着较好的区分度，对于低密度集群与高密度集群使用了不同的密度阈值来区分是否离群点。  \n",
    "因此，我们从直观上可以得到一个印象，即基于LOF模型的离群点识别在某些情况下，可能比基于某种统计学分布规则的识别更加符合实际情况。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "还有一个比较明显的问题是，集群点较靠近边界的点容易判断为离群点。紫色的几个圈均是处于集群点边界的点，均被判断错误。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- #### 基于PyOD的实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pyod.models.lof import LOF\n",
    "from pyod.utils.data import generate_data\n",
    "from pyod.utils.data import evaluate_print\n",
    "from pyod.utils.example import visualize"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "contamination = 0.1  # percentage of outliers\n",
    "n_train = 200  # train data\n",
    "n_test = 100 # test data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\envs\\deep_learning\\lib\\site-packages\\pyod\\utils\\data.py:185: FutureWarning: behaviour=\"old\" is deprecated and will be removed in version 0.8.0. Please use behaviour=\"new\", which makes the returned datasets in the order of X_train, X_test, y_train, y_test.\n",
      "  warn('behaviour=\"old\" is deprecated and will be removed '\n"
     ]
    }
   ],
   "source": [
    "X_train, y_train, X_test, y_test = \\\n",
    "    generate_data(n_train=n_train,\n",
    "                  n_test=n_test,\n",
    "                  n_features=2,\n",
    "                  contamination=contamination,\n",
    "                  random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LOF(algorithm='auto', contamination=0.1, leaf_size=30, metric='minkowski',\n",
       "  metric_params=None, n_jobs=1, n_neighbors=20, p=2)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# train LOF detector\n",
    "clf_name = 'LOF'\n",
    "clf = LOF()\n",
    "clf.fit(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_pred = clf.labels_ #二进制（0:inliers, 1:outliers）\n",
    "y_train_scores = clf.decision_scores_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_pred = clf.predict(X_test)\n",
    "y_test_scores = clf.decision_function(X_test) # outlier scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "On Training Data:\n",
      "LOF ROC:0.9997, precision @ rank n:0.95\n",
      "\n",
      "On Test Data:\n",
      "LOF ROC:1.0, precision @ rank n:1.0\n"
     ]
    }
   ],
   "source": [
    "# evaluate and print the results\n",
    "print(\"\\nOn Training Data:\")\n",
    "evaluate_print(clf_name, y_train, y_train_scores)\n",
    "print(\"\\nOn Test Data:\")\n",
    "evaluate_print(clf_name, y_test, y_test_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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rGpWvO7eLcViuZfFYt7ySpo1a5YkacyYMeru7g683bPPPqsHH3xQM2bM0I4dO/Tqq69KkiZOnKiZM2ceXW/KlCmaOHGiLrroIq1fv15tbW2V/QAAUEdkNoCwqlnxOnq01Nube1lvr7e8koYNGzag7c466ywtXLhQGzZs0M0336wxY8ZIktrb2/ust23bNl144YV69NFHdfDgQT322GNltxkAwoLMBhBWNSte29ulefOk7IPdtjbv9aycqZtrrrlGDz/8sKZPn6677rpLp556as71xo0bp9tuu03vec97tGfPHk2bNq3GLQWA6iGzAYSVOecCrzxt2jS3adOmPq8988wzOvvsswNtn0x6Hf1XrvQuO/X2eiG4dKkUL3uur2go5fsCUDlmttk511AVC5ldPjIbqI9CmV3T+InHpWXLpCVLvP5So0eH5+gdANAXmQ0gjOpy7NzeLk2YUI89AwBKRWYDCJO6zLCFiHAp6YXV3m8AQPiR22gAFK/I75W10q/nSq88WO+WFEdgA0B0cpvMRhkoXpGbS0lbFnuPtywOf8BEJbABoFqilNtkNspQn+K1DkdcW7du1datW/u9njnNYNrChQur3p7Qe2WtdGS/9/jIvnAHTJQCG4giMjsaopLbZDbKVJ/itQ5HXPmCMJdvfvObVW1L6KWDJelPn5hMhDtgohLYQFSR2eEXpdwms1Gm2o82kH3Edeplkg28hj5y5Ihmz56t3bt365RTTtHYsWN10UUXacaMGVqzZo2kY9MHStL999+vn/70pwXfc8aMGdqwYYMkqaOjQ7NmzdLevXt17rnn6o477ji6zjvf+U49+eSTWr9+vTo7O3XFFVfo8OHDGjlypL7//e8rHtWBEDODJS0dMGMur0+b8skX2GX+vaorl5J23CudfnV0PwMGDzI7GqKS22Q2KqD233KFj7juueceTZw4Ub/4xS80fvx4rVq1qt86S5Ys0Q033KAbbrihaAhmW758uSZOnKiNGzfqtdde05NPPilJevzxx3XBBRdo/fr1kqSnn35aTU1N2rhxo+bMmaNEIlHW56qb7GBJC+tRfKHAjir6giFMyOzwi1Juk9mogNoWr1W4rPH000/r3e9+tyTp/PPP18c//vGjyzo7O8tqrnTsDMCMGTO0Y8cOvfrqq5KkiRMnaubMmUfXmzJliiZOnKiLLrpI69evV1v2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\n",
      "text/plain": [
       "<Figure size 864x720 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualize the results\n",
    "visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,\n",
    "          y_test_pred, show_figure=True, save_figure=False)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
